#ifndef ___fat32_leer_escribir_sectores_funciones_auxiliares_1

#define ___fat32_leer_escribir_sectores_funciones_auxiliares_1 1

#include "f32_dles.c"
#include "f32_base.c"
#include "mtlib.c"

void fat32_insertar_operacion_terminada(unsigned int, unsigned long, unsigned char);
void fat32_insertar_bloqueo_lectura(unsigned int, unsigned int, unsigned long, void *);
void fat32_insertar_bloqueo_escritura(unsigned int, unsigned int, unsigned long);
void fat32_leer_bloque(unsigned long, unsigned int);
void fat32_escribir_bloque(unsigned long, unsigned int, const void *, unsigned char);

void fat32_insertar_operacion_terminada (unsigned int transaccion, unsigned long sector, unsigned char tipoOperacion) {
  fat32_operacion_terminada nuevaOp;
  nuevaOp.transaccion = transaccion;
  nuevaOp.sector = sector;
  nuevaOp.operacion = tipoOperacion;
  fat32_cantidad_operaciones_terminadas ++;
  fat32_operaciones_terminadas = fb_cambiar_tamano(fat32_operaciones_terminadas, sizeof(fat32_operacion_terminada),
                                                   fat32_cantidad_operaciones_terminadas);
  fat32_operaciones_terminadas[fat32_cantidad_operaciones_terminadas - 1] = nuevaOp;
}

void fat32_insertar_bloqueo_lectura (unsigned int transaccion, unsigned int conexion, unsigned long sector, void * buffer) {
  fat32_bloqueo nuevoBloqueo;
  nuevoBloqueo.transaccionBloqueada = transaccion;
  nuevoBloqueo.tipoEvento = 1;
  nuevoBloqueo.datosEvento.lectura.sector = sector;
  nuevoBloqueo.datosEvento.lectura.conexion = conexion;
  nuevoBloqueo.datosEvento.lectora.estado = 0;
  nuevoBloqueo.datosEvento.lectura.buffer = buffer;
  unsigned int posicion;
  for (posicion = 0; posicion < fat32_cantidad_bloqueos; posicion ++)
    if (!fat32_bloqueos[posicion].tipoEvento) break;
  if (posicion == fat32_cantidad_bloqueos)
    fat32_bloqueos = fb_cambiar_tamano(fat32_bloqueos, sizeof(fat32_bloqueo), ++ fat32_cantidad_bloqueos);
  fat32_bloqueos[posicion] = nuevoBloqueo;
}

void fat32_insertar_bloqueo_escritura (unsigned int transaccion, unsigned int conexion, unsigned long sector) {
  fat32_bloqueo nuevoBloqueo;
  nuevoBloqueo.transaccionBloqueada = transaccion;
  nuevoBloqueo.tipoEvento = 2;
  nuevoBloqueo.datosEvento.escritura.sector = sector;
  nuevoBloqueo.datosEvento.escritura.conexion = conexion;
  nuevoBloqueo.datosEvento.escritura.estado = 0;
  unsigned int posicion;
  for (posicion = 0; posicion < fat32_cantidad_bloqueos; posicion ++)
    if (!fat32_bloqueos[posicion].tipoEvento) break;
  if (posicion == fat32_cantidad_bloqueos)
    fat32_bloqueos = fb_cambiar_tamano(fat32_bloqueos, sizeof(fat32_bloqueo), ++ fat32_cantidad_bloqueos);
  fat32_bloqueos[posicion] = nuevoBloqueo;
}

void fat32_leer_bloque (unsigned long sector, unsigned int conexion) {
  unsigned long sectorActual = sector & ~3L;
  unsigned char cantidad;
  for (cantidad = 0; cantidad < 4; cantidad ++)
    mtf_enviar_mensaje(fat32_centro_mensajes, conexion, MTE_LEER_SECTOR, (long) sectorActual + cantidad);
}

void fat32_escribir_bloque (unsigned long bloque, unsigned int conexion, const void * datos, unsigned char mascara) {
  unsigned long sectorActual = sector & ~3L;
  unsigned char cantidad;
  const char * buffer = datos;
  for (cantidad = 0; cantidad < 4; cantidad ++, buffer += 512)
    if (mascara & (1 << cantidad))
      mtf_enviar_mensaje(fat32_centro_mensajes, MTE_ESCRIBIR_SECTOR, (long) sectorActual + cantidad, (void *) buffer);
}

#endif